module Aio::Text
  class Block
    attr_accessor :content, :line

    def initialize(block)
      @block = block
    end

    def inspect
      @block.inspect
    end

    def nil?
      @block.nil?
    end

    def [](sym)
      @block[sym]
    end

    # 有两种更新的方式，不加str 那么就是从block中的提取
    # 如果有str， 则直接使用str
    def update(info, sym, str=nil)
      sym = sym.to_sym
      if info.nil?
        print_error "请检查update中的第一个参数是否定义" 
        pp caller
      end

      if str.nil?
        info[sym] = match_string(self[sym].strip)
      else
        info[sym] = match_string(str.to_s.strip)
      end
    end

    def update_arr(info, sym)
      sym = sym.to_sym
      info[sym] ||= []
      info[sym] << match_string(self[sym].strip)
    end

    def update_hash(info, sym, key, val)
      sym = sym.to_sym
      info[sym] ||= {}
      info[sym][key] = match_string(val.strip)
    end

    # 参数info 放置useful
    # 参数sym  为Symbol类型的标示
    # 参数level 为 :serious 或 :ordinary
    # 参数mod  一般为self
    # 参数opt[:string] 当block中没有sym项时使用
    def warning(info, sym, level, mod, opt={})
      sym = sym.to_sym
      self.update(info, sym, opt[:string])
      # Aio::Text::Warning 类中的warning方法
      mod.warning_klass.warning(info, sym, level, mod, opt[:force])
    end

    def warning_serious(info, sym, mod, opt={})
      sym = sym.to_sym
      self.update(info, sym, opt[:string])
      mod.warning_klass.warning_serious(info, sym, mod, opt[:force])
    end

    def warning_ordinary(info, sym, mod, opt={})
      sym = sym.to_sym
      self.update(info, sym, opt[:string])
      mod.warning_klass.warning_ordinary(info, sym, mod, opt[:force])
    end

    # 加入content和行数信息
    def match_string(str)
      MatchStringInfo.new(str, content, line)
    end

    def method_missing(m, *args)
      if @block.respond_to? m
        @block.send(m, args)

      else
        super
      end
    end

  end
end
